﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://www.vovisoft.com/dotNET/Projects/vnTextbox/vnTextbox.htm -->
<HTML><HEAD><TITLE>Vietnamese Textbox</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META http-equiv=Content-Language content=vi>
<META content="MSHTML 6.00.2900.2627" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="Visual Basic, VB Programming in Vietnamese, VB.NET, Vovisoft, VB6, VB Tutorials, Learn Visual Basic, Internet, Unicode, Vietnamese VB tutorials, Database, Asp, Java, Javascript, VBscript, FrontPage 2000, XML, Ms Office 2000" 
name=keywords><LINK href="Vietnamese Textbox_files/topbottom.css" type=text/css 
rel=stylesheet>
<SCRIPT language=JavaScript src=""></SCRIPT>
</HEAD>
<BODY leftMargin=0 topMargin=0 marginheight="0" marginwidth="0">
<P align=center><A href="http://www.vovisoft.com/"><IMG height=77 
alt="Logo of Vovisoft" src="Vietnamese Textbox_files/vs-logo4_10.gif" width=102 
border=0> </A></P><!-- Cut and paste your content after this line --><FONT 
face=Tahoma>
<CENTER>
<H2><FONT face=Tahoma color=#800000>Thừa kế Textbox để đánh chữ Việt 
Unicode</FONT></H2></CENTER>
<BLOCKQUOTE>
  <H3><FONT face=Tahoma color=green>Lập trình dùng thừa kế</FONT></H3>Hết rồi 
  giai đoạn bực mình với VB6 thì sự giới hạn về lập trình theo hướng đối tượng 
  (Object Oriented), .NET cho phép ta tha hồ thừa kế. Do đó, một trong những dự 
  án nho nhỏ đầu tiên của chúng ta là thừa kế từ Textbox bình thường để tạo một 
  Textbox, tạm gọi là vnTextbox, hỗ trợ đánh chữ Việt Unicode theo lối VNI hay 
  VIQR. Dĩ nhiên, ta vẫn tiếp tục giữ các programs bỏ dấu chuyên nghiệp ưng ý 
  của mình như VietKey, UniKey, VPSKey, .v.v.., nhưng có thể sau nầy sẽ có 
  trường hợp ta cung cấp cho khách hàng một chương trình áp dụng tiếng Việt để 
  họ dùng cho nhu cầu chuyên môn mà không cần phải dùng thêm một program bỏ dấu 
  hỗ trợ.<BR><BR>Để tạo một Control thừa kế từ Textbox bạn khởi động một Project 
  mới loại Windows Control Library như sau:<BR>
  <BLOCKQUOTE><IMG height=394 
    src="Vietnamese Textbox_files/WindowsControlProject.gif" 
  width=531></BLOCKQUOTE><BR>Kế đó, khi mở code ra thay thế hai hàng: <BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> UserControl1 
   <FONT color=blue>Inherits</FONT> System.Windows.Forms.UserControl 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>bằng hai hàng sau: 
<BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> vnTextbox 
   <FONT color=blue>Inherits</FONT> System.Windows.Forms.TextBox 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>
  <H3><FONT face=Tahoma color=green>Đánh dấu theo lối VNI</FONT></H3>Ðể đánh dấu 
  cho các nguyên âm chữ Việt, trong vnTextbox ta tạm dùng phương pháp VNI. Tức 
  là ta đánh nguyên âm trước, kế đó ta đánh một con số từ 1 đến 9 để bỏ 
  dấu.<BR><BR>Các con số 1..6 theo sau chữ <B>a</B> chẳng hạn, sẽ cho ta các chữ 
  <B>á à ả ã ạ â</B>; số 7 theo sau chữ <B>u</B> sẽ cho ta <B>ư</B>; số 8 theo 
  sau chữ <B>a</B> sẽ cho ta <B>ă</B>; số 9 theo sau chữ <B>d</B> sẽ cho ta 
  <B>đ</B>. Để bỏ hai dấu thì ta dùng hai con số, thí dụ <B>a36</B> thì sẽ đuợc 
  hiển thị thành <B>ẩ</B>, còn <B>u27</B> thì sẽ cho <B>ừ</B>. Ðể đánh các chữ 
  <B>đ</B> và <B>Ð</B> ta dùng <B>d9</B> và <B>D9</B>. Chắc chắn bạn sẽ thấy 
  program nầy đơn sơ quá, nhưng nó sẽ dễ hiểu, và sau đó, nếu thích bạn có thể 
  thêm thắt các chức năng.<BR><BR>Để bỏ dấu theo lối VIQR thì thay vì các con số 
  1,2,3,4,5,6,7,8,9 ta dùng <B>' ` ? ~ . ^ +</B> (hay *) <B>( d</B> (hay -). Ðặc 
  biệt control vnTextbox nầy dùng gần như hoàn toàn look-up table để tính ra các 
  nguyên âm có dấu. Trước hết, mỗi khi user đánh một con số từ 1 đến 9, thì 
  program nhìn xem character phía trước cursor (gọi là <B>LastCh</B>) là chữ gì. 
  Kế đó nó tìm đến hàng chữ chứa toàn bộ những nguyên âm có thể thay thế LastCh, 
  tùy theo con số mà user vừa đánh vào. Ở đây kể cả trường hợp user vừa đánh một 
  Backspace. <BR><BR>Cái bảng chứa những hàng chữ ấy đuợc chứa trong một 
  array-of-string tên <B>ChList</B> và nó được initialised trong Constructor 
  <B>Sub New</B> của vnTextbox như dưới đây: <BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Private</FONT> ChList(148) <FONT color=blue>As String</FONT>  ' List of character groups like "aáàảãạâ-ă"
ChList(0) = "aáàảãạăắằẳẵặâấầẩẫậeéèẻẽẹêếềểễệiíìỉĩịoóòỏõọôốồổỗộơớờởỡợuúùủũụưứừửữựyýỳỷỹỵdđAÁÀẢÃẠĂẮẰẲẴẶÂẤẦẨẪẬEÉÈẺẼẸÊẾỀỂỄỆIÍÌỈĨỊOÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢUÚÙỦŨỤƯỨỪỬỮỰYÝỲỶỸỴD" 
ChList(1) = "aáàảãạâ-ă" 
ChList(2) = "a^àảãạấ-ắ" 
ChList(3) = "aá^ảãạầ-ằ" 
ChList(4) = "aáà^ãạẩ-ẳ" 
ChList(5) = "aáàả^ạẫ-ẵ" 
ChList(6) = "aáàảã^ậ-ặ" 
ChList(7) = "aắằẳẵặâ-^" 
ChList(8) = "ăắằẳẵặấ-ắ" 
ChList(9) = "ăắằẳẵặầ-ằ" 
ChList(10) = "ăắằẳẵặẩ-ẳ" 
ChList(11) = "ăắằẳẵặẫ-ẵ" 
ChList(12) = "ăắằẳẵặậ-ặ" 
ChList(13) = "aấầẩẫậ^-ă" 
ChList(14) = "âấầẩẫậấ-ắ" 
ChList(15) = "âấầẩẫậầ-ằ" 
ChList(16) = "âấầẩẫậẩ-ẳ" 
ChList(17) = "âấầẩẫậẫ-ẵ" 
ChList(18) = "âấầẩẫậậ-ặ" 
ChList(19) = "eéèẻẽẹê" 
ChList(20) = "e^èẻẽẹế" 
ChList(21) = "eé^ẻẽẹề" 
ChList(22) = "eéè^ẽẹể" 
ChList(23) = "eéèẻ^ẹễ" 
ChList(24) = "eéèẻẽ^ệ" 
ChList(25) = "eếềểễệ^" 
ChList(26) = "êếềểễệế" 
ChList(27) = "êếềểễệề" 
ChList(28) = "êếềểễệể" 
ChList(29) = "êếềểễệễ" 
ChList(30) = "êếềểễệệ" 
. . .
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>ChList(0) chứa toàn bộ các 
  nguyên âm. Tương ứng với mỗi nguyên âm (LastCh) trong ChList(0) là một hàng 
  chứa tất cả mọi chữ có thể đuợc dùng để thay thế LastCh khi user đánh vào một 
  con số 1..9 hay Backspace.<BR>Thí dụ nếu LastCh là <FONT size=+2>à</FONT>, ta 
  sẽ dùng ChList(3), nó chứa các chữ: <FONT size=+2>aá^ảãạầ-ằ</FONT><BR>Kế đó 
  nếu user đánh số 3 ta sẽ thay thế dấu <B>sắc</B> thành dấu <B>hỏi</B> để có 
  chữ <FONT size=+2>ả</FONT>. Còn nếu thay vì đánh số 3, user đánh số 8, thì ta 
  sẽ có chữ <FONT size=+2>ằ</FONT>, tức là thêm dấu <FONT size=+2>ă</FONT> cho 
  chữ <FONT size=+2>à</FONT>.<BR>Nếu user đánh thêm một số <B>7</B> thì 
  character tướng ứng với số 7 trong hàng <B>aá^ảãạầ-ằ</B> là <FONT 
  size=+2>-</FONT>, hể gặp character - thì ta làm ngơ.<BR>Nếu user đánh thêm một 
  số <B>2</B> sau chữ <FONT size=+2>à</FONT> bạn sẽ thấy character tướng ứng với 
  số 2 trong hàng <B>aá^ảãạầ-ằ</B> là <FONT size=+2>^</FONT>. Điều nầy nhắc ta 
  biết là user đánh <FONT size=+2>a</FONT><B>22</B>, nên ta sẽ hiển thị <FONT 
  size=+2>a</FONT><B>2</B>. <BR>Nếu user đánh Backspace, thay vì một con số, ta 
  sẽ dùng nguyên âm nằm ở đầu dòng, tức là chữ <FONT size=+2>a</FONT>. Như thế 
  nếu LastCh là <FONT size=+2>ẩ</FONT>, thì sau một Backspace ta có <FONT 
  size=+2>ả</FONT>, sau thêm một Backspace kế tiếp ta sẽ còn lại <FONT 
  size=+2>a</FONT>.<BR><BR>Kỹ thuật Program dùng để thay thế LastCh là select 
  (highlight) LastCh rồi Paste nguyên âm mới. <BR><BR>Dưới đây là Listing của 
  <B>Function GetToneCharPos() </B>để trả về một giá trị từ 1 đến 9 tượng trưng 
  cho dấu:<BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Private</FONT> <FONT color=blue>Function</FONT> GetToneCharPos( <FONT color=blue>ByVal</FONT> KeyChar <FONT color=blue>As</FONT> Integer) <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
  <FONT color=green>' If Typing stype is VNI, see if user enters "1".."9" or "d"</FONT>
  <FONT color=green>' If so return 1..9 and also 9 for "d". Otherwise return -1</FONT>
  <FONT color=green>'</FONT>
  <FONT color=green>' If Typing stype is VIQR, return 1..9 for characters '`?~.^+(d . Otherwise return -1</FONT>
  <FONT color=green>' We also allow for * and - to be same as + and d successively.</FONT>
  <FONT color=green>' i.e. u+ or u* and dd or d- are OK.</FONT>
   GetToneCharPos = -1 
   <FONT color=blue>If</FONT> mTypingStyle = "VNI" <FONT color=blue>Then</FONT> 
      <FONT color=blue>If</FONT> (KeyChar = 68) <FONT color=blue>Or</FONT> (KeyChar = 100) <FONT color=blue>Then</FONT> <FONT color=green>' ie. "d" for dd or DD</FONT>
         GetToneCharPos = 9 
      <FONT color=blue>ElseIf</FONT> (KeyChar &gt;= &amp;H31) <FONT color=blue>And</FONT> (KeyChar &lt;= &amp;H39) <FONT color=blue>Then</FONT> 
        <FONT color=green>' it's a digit. KeyChar of "1" is &amp;H31</FONT>
         GetToneCharPos = KeyChar - &amp;H30 
      <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
   <FONT color=blue>ElseIf</FONT> mTypingStyle = "VIQR" <FONT color=blue>Then</FONT> 
      Console.WriteLine("KeyChar:{0}", KeyChar) 
      <FONT color=blue>Select</FONT> <FONT color=blue>Case</FONT> KeyChar 
      <FONT color=blue>Case</FONT> 39 <FONT color=green>'</FONT>
         GetToneCharPos = 1 <FONT color=green>' '</FONT>
      <FONT color=blue>Case</FONT> 96 
         GetToneCharPos = 2 <FONT color=green>' `</FONT>
      <FONT color=blue>Case</FONT> 126 
         GetToneCharPos = 4 <FONT color=green>' ~</FONT>
      <FONT color=blue>Case</FONT> 63 
         GetToneCharPos = 3 <FONT color=green>' ?</FONT>
      <FONT color=blue>Case</FONT> 46 
         GetToneCharPos = 5 <FONT color=green>' .</FONT>
      <FONT color=blue>Case</FONT> 94 
         GetToneCharPos = 6 <FONT color=green>' ^</FONT>
      <FONT color=blue>Case</FONT> 43, 42 <FONT color=green>' + or *</FONT>
         GetToneCharPos = 7 
      <FONT color=blue>Case</FONT> 40 
         GetToneCharPos = 8 <FONT color=green>' (</FONT>
      <FONT color=blue>Case</FONT> 100, 68, 45 <FONT color=green>' d D or -</FONT>
         GetToneCharPos = 9 
      <FONT color=blue>End</FONT> <FONT color=blue>Select</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>Trong Control vnTextbox ta 
  không thể để code hỗ trợ đánh dấu chữ Việt trong <B>Sub vnTextbox_KeyDown</B> 
  hay <B>Sub vnTextbox_KeyUp</B> được vì một khi KeyDown hay KeyDown Events đã 
  được raised rồi ta không thể bỏ qua Keystroke hay thay đổi trị giá của nó 
  thành 0 như trong VB6. Do đó, ở đây ta Override <B>Function 
  ProcessKeyMessage</B>. Nếu giá trị trả về (Returned value) của hàm 
  ProcessKeyMessage là True thì ta ngăn cản không cho Keyboard Event xẩy ra. 
  Loại Event có thể xẩy ra sau đó tùy thuộc vào trị số của <B>m.Msg</B>. Trong 
  hàm ProcessKeyMessage, ta chỉ xử lý thông điệp m.Msg = KeyUp (có giá trị 258). 
  Nếu m.Msg là cho KeyDown hay KeyPress thì ta làm ngơ và cho ProcessKeyMessage 
  return False để KeyDown hay KeyPress events xẩy ra như bình thường. <BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Protected</FONT> <FONT color=blue>Overrides</FONT> <FONT color=blue>Function</FONT> ProcessKeyMessage( <FONT color=blue>ByRef</FONT> m <FONT color=blue>As</FONT> System.Windows.Forms.Message) <FONT color=blue>As</FONT> <FONT color=blue>Boolean</FONT> 
  <FONT color=green>' Get out if this is not a KeyUp message</FONT>
   <FONT color=blue>If</FONT> m.Msg &lt;&gt; 258 <FONT color=blue>Then</FONT> <FONT color=blue>Return</FONT> <FONT color=blue>False</FONT> 
   <FONT color=blue>Const</FONT> Delay <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> = 100 
  <FONT color=green>' Obtain the Keystroke character</FONT>
   <FONT color=blue>Dim</FONT> KeyChar <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> = m.WParam.ToInt32 
  <FONT color=green>' Process a keystroke</FONT>
   <FONT color=blue>Dim</FONT> Pos, ToneCharPos, Offset <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>Dim</FONT> NewCh <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>If</FONT> KeyChar = 8 <FONT color=blue>Then</FONT> <FONT color=green>' It's a backspace character</FONT>
      <FONT color=blue>If</FONT> Me.SelectionStart = 0 <FONT color=blue>Then</FONT> <FONT color=blue>Return</FONT> <FONT color=blue>True</FONT> 
     <FONT color=green>' Obtain the position of the line containing all possible modified characters</FONT>
      Pos = GetLastCharMapPos() 
     <FONT color=green>' Select the character just on the left of the cursor</FONT>
      Me.SelectionStart -= 1 
      Me.SelectionLength = 1 
      <FONT color=blue>If</FONT> Pos &gt; 0 <FONT color=blue>Then</FONT> 
         <FONT color=blue>If</FONT> LastCh &lt;&gt; ChList(Pos).Substring(0, 1) <FONT color=blue>Then</FONT> 
           <FONT color=green>' Get here if backspace means removing ^ or ', ` etc..</FONT>
           <FONT color=green>' Copy the new (modified) character to clipboard, it's the leftmost</FONT>
           <FONT color=green>' character on the line</FONT>
            Clipboard.SetDataObject(ChList(Pos).Substring(0, 1)) 
           <FONT color=green>' Paste it to replace the character on the left</FONT>
            Me.Paste() 
            ConcatCharacterIfFailed(ChList(Pos).Substring(0, 1)) 
         <FONT color=blue>Else</FONT> 
           <FONT color=green>' get here if it's a genuine backspace</FONT>
            Me.Cut() 
         <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
      <FONT color=blue>Else</FONT> 
        <FONT color=green>' Select the character just on the left of the cursor</FONT>
         Me.Cut() 
      <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
     <FONT color=green>' Swallow the actual keystroke</FONT>
      <FONT color=blue>Return</FONT> <FONT color=blue>True</FONT> 
   <FONT color=blue>ElseIf</FONT> KeyChar = 92 <FONT color=blue>Then</FONT> <FONT color=green>' it's a back slash \ which is the Escape character</FONT>
      <FONT color=blue>If</FONT> <FONT color=blue>Not</FONT> EscapeFlag <FONT color=blue>Then</FONT> 
         EscapeFlag = <FONT color=blue>True</FONT> <FONT color=green>' Set the Escape flag</FONT>
         <FONT color=blue>Return</FONT> <FONT color=blue>True</FONT> <FONT color=green>' Swallow the actual keystroke</FONT>
      <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
   <FONT color=blue>Else</FONT> 
     <FONT color=green>' Map the key entered (i.e: "1".."9", "d", or "'", "`" , "?" , "~", ".", "+", "(" ) </FONT>
     <FONT color=green>' to the position 1..9, to be used for selecting the new character from a string like:</FONT>
     <FONT color=green>' eg: a a' a` a? a~ a. a^ - a(</FONT>
      ToneCharPos = GetToneCharPos(KeyChar) 
      <FONT color=blue>If</FONT> ToneCharPos &gt; 0 <FONT color=blue>Then</FONT> 
        <FONT color=green>' Get here if a digit in range 1..9 has been entered</FONT>
        <FONT color=green>' Ignore the digit if Escape Flag is set</FONT>
         <FONT color=blue>If</FONT> <FONT color=blue>Not</FONT> EscapeFlag <FONT color=blue>Then</FONT> 
           <FONT color=green>' Obtain the position of the line containing all possible modified characters</FONT>
            Pos = GetLastCharMapPos() 
           <FONT color=green>' If Pos = 0 then simply display the character, ie. leave the keystroke alone</FONT>
            <FONT color=blue>If</FONT> Pos &gt; 0 <FONT color=blue>Then</FONT> 
              <FONT color=green>' Work out the offset of the new character on the line</FONT>
               Offset = ToneCharPos + 1 
               <FONT color=blue>If</FONT> Offset &lt;= ChList(Pos).Length <FONT color=blue>Then</FONT> 
                 <FONT color=green>' Extract the new character</FONT>
                  NewCh = ChList(Pos).Substring(Offset - 1, 1) 
                 <FONT color=green>' Console.WriteLine("ChList:{0} Pos:{1} Offset-1:{2}", ChList(Pos), Pos, Offset - 1)</FONT>
                  <FONT color=blue>If</FONT> NewCh = "^" <FONT color=blue>Then</FONT> <FONT color=green>' roll back last character</FONT>
                    <FONT color=green>' eg: letter a followed by 11 =&gt; á1 to become a1</FONT>
                    <FONT color=green>' Select the character just on the left of the cursor</FONT>
                     Me.SelectionStart -= 1 
                     Me.SelectionLength = 1 
                    <FONT color=green>' Copy leftmost character on the line to clipboard</FONT>
                     Clipboard.SetDataObject(ChList(Pos).Substring(0, 1)) 
                    <FONT color=green>' Paste it to replace the character on the left</FONT>
                     Me.Paste() 
                     ConcatCharacterIfFailed(ChList(Pos).Substring(0, 1)) 
                    <FONT color=green>' Leave keystroke alone to let it fall through and be displayed</FONT>
                    <FONT color=green>' Forget it if the new character is "-", let the keystroke displayed</FONT>
                  <FONT color=blue>ElseIf</FONT> NewCh &lt;&gt; "-" <FONT color=blue>Then</FONT> 
                    <FONT color=green>' Select the character just on the left of the cursor</FONT>
                     Me.SelectionStart -= 1 
                     Me.SelectionLength = 1 
                    <FONT color=green>' Copy the new (modified) character to clipboard</FONT>
                     ToClipboard(NewCh) 
                    <FONT color=green>' Paste it to replace the character on the left</FONT>
                     Me.Paste() 
                     ConcatCharacterIfFailed(NewCh) 
                     <FONT color=blue>Return</FONT> <FONT color=blue>True</FONT> <FONT color=green>' Swallow the actual keystroke</FONT>
                  <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
               <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
            <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
         <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
      <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
   EscapeFlag = <FONT color=blue>False</FONT> <FONT color=green>' Reset the Escape Flag</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>Để vnTextbox hỗ trợ hai 
  lối bỏ dấu, VNI và VIQR, ta cho nó <B>Property TypingStyle</B> như 
sau:<BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=blue>Property</FONT> TypingStyle() <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>Get</FONT> 
      <FONT color=blue>Return</FONT> mTypingStyle 
   <FONT color=blue>End</FONT> <FONT color=blue>Get</FONT> 
   <FONT color=blue>Set</FONT> ( <FONT color=blue>ByVal</FONT> Value <FONT color=blue>As</FONT> String) 
     <FONT color=green>' Chỉ chấp nhận "VNI" hay "VIQR" mà thôi</FONT>
      <FONT color=blue>If</FONT> Value = "VNI" <FONT color=blue>Or</FONT> Value = "VIQR" <FONT color=blue>Then</FONT> 
         mTypingStyle = Value 
      <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
   <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>Lưu ý cách <B>copy</B> một 
  character vào Clipboard:<BR><BR>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=green>' Copy it to clipboard</FONT>
Clipboard.SetDataObject(Ch) 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>Việc <B>lấy</B> Unicode 
  text string từ Clipboard gồm có hai bước: 
  <OL>
    <LI>Tạo một DataObject Interface với <B>Clipboard.GetDataObject()</B> 
    <LI>Dùng Interface ấy để lấy data từ Clipboard dưới dạng Unicode 
    (<B>DataFormats.UnicodeText</B>), rồi đổi nó ra string </LI></OL>
  <BLOCKQUOTE>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3><PRE><FONT color=green>' Create a new instance of the DataObject interface.</FONT>
<FONT color=blue>Dim</FONT> data <FONT color=blue>As</FONT> IDataObject = Clipboard.GetDataObject() 
<FONT color=green>' Retrieve LastCh the character in Unicode Text format from clipboard</FONT>
LastCh = data.GetData(DataFormats.UnicodeText).ToString() 
</PRE></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE>Chắc bạn đã để ý, chữ Việt 
  ta dùng ở đây là Unicode, mặc dầu ta không nhắc gì đến encoding của nó hay 
  code point của mỗi character. Nếu bạn chưa quen với Unicode cho chữ Việt thì 
  hãy đọc bài <A 
  href="http://www.vovisoft.com/dotNET/Support/UnicodeBasic/NETUnicode.htm">Dùng 
  Unicode chữ Việt trong .NET</A><BR><BR>Rất tiếc vì method Paste bên trong 
  vnTextbox không reliable (bất chừng), nhiều khi nó không Paste được nên LastCh 
  vẫn còn bị highlighted. Trong trường hợp đó <B>Sub ConcatCharacterIfFailed</B> 
  sẽ dùng string concatenation (ghép strings) để khắc phục khó khăn. Nhưng cách 
  ghép strings không hiệu năng bằng Paste. <BR><BR>Control vnTextbox có hỗ trợ 
  Escape character <B>\</B>. Con số theo sau Escape character <B>\</B> sẽ không 
  bị dùng vào việc bỏ dấu cho nguyên âm ngay trước đó.<BR><BR>
  <BLOCKQUOTE><B>Xin lưu ý:</B> Ðể program nầy chạy bỏ dấu đuợc bạn phải tạm 
    thời ngưng các programs như VPSkey hay VietKey, UniKey .v.v.. Lý do là các 
    programs kia sẽ giựt trước các keystrokes của những con số 1 đến 9, sau khi 
    kiểm tra rồi không chịu buông ra cho program nầy thấy. </BLOCKQUOTE><BR>Bạn có 
  thể tải về mã nguồn của <A 
  href="http://www.vovisoft.com/dotNET/Projects/vnTextbox/vnTextbox.zip">control 
  vnTextbox</A> và <A 
  href="http://www.vovisoft.com/dotNET/Projects/vnTextbox/TestvnTextbox.zip">chương 
  trình thử</A>. Hai Zip files nầy là cho 2 projects. Bạn load vnTextbox và 
  compile trước để dùng WindowsControlLibrary2.dll trong <B>bin</B> folder làm 
  reference cho project TestvnTextbox. Sau khi load TestvnTextbox, bạn hãy 
  remove WindowsControlLibrary2 từ References của nó rồi dùng Menu Command 
  <B>Project |Add Reference</B> để refernce library WindowsControlLibrary2.dll 
  vừa mới compile.<BR><BR>Nếu bao giờ IDE than phiền về Licence bạn chỉ cần 
  delete file <B>licences.licx</B> trong Project Folder.<BR>Dưới đây là hình 
  form chính của program TestvnTextbox.<BR>
  <BLOCKQUOTE><IMG height=232 src="Vietnamese Textbox_files/TestvnTextbox.gif" 
    width=440></BLOCKQUOTE></BLOCKQUOTE>
<BLOCKQUOTE><A href="http://www.vovisoft.com/"><IMG height=40 
  src="Vietnamese Textbox_files/homejump.gif" width=40><A>&nbsp;&nbsp;<A 
  href="http://www.vovisoft.com/dotNET/default.asp">Học Microsoft 
  .NET</A><BR><BR></BLOCKQUOTE><BR>
<BLOCKQUOTE></BLOCKQUOTE></< Font><!-- Start of bottom bar for copyright notice etc -->
<TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
width="100%" border=0>
  <TBODY>
  <TR>
    <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
      <P align=center><FONT face=Tahoma color=#ffffff size=1>Vovisoft Â© 2000. 
      All rights reserved.</FONT></P></TD></TR>
  <TR>
    <TD width=256>
      <P align=center><FONT face=Tahoma size=1>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->23 
      Dec 2003<!--webbot 
      bot="Timestamp" endspan i-checksum="14404" --> </FONT></P></TD>
    <TD width=181><FONT face=Tahoma size=1>&nbsp;</FONT></TD>
    <TD width=258>
      <P align=center><FONT face=Tahoma size=1><A 
      href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE><BR></FONT></BODY></HTML>
